package ucla.axelia.vista;

import ucla.axelia.controlador.interfaces.IServicioAdministracionAsignarReconocimiento;
import ucla.axelia.modelo.beans.RespuestaCerrada;
import ucla.axelia.modelo.data.ActividadPlanificada;
import ucla.axelia.modelo.data.AsistenciaVoluntario;
import ucla.axelia.modelo.data.DataGenerica;
import ucla.axelia.modelo.data.Reconocimiento;
import ucla.axelia.modelo.data.ReconocimientoRequerido;
import ucla.axelia.modelo.data.TipoActividadRequerida;
import ucla.axelia.modelo.data.Voluntario;
import ucla.axelia.modelo.data.ReconocimientoVoluntario;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.vista.componentes.Catalogo;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.TextFieldCatalogo;
import com.obelisco.vista.componentes.TextFieldCatalogoListener;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.BindingDateField;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class PaneAsignarReconocimiento extends ContentPane implements ComponenteDatosListener {
	
	private IServicioAdministracionAsignarReconocimiento servicioAdministracionAsignarReconocimiento;
	private ReconocimientoVoluntario reconocimientovoluntario;
	private Voluntario voluntario;
	private Reconocimiento reconocimiento;
	
	private TextFieldCatalogo txtCatVoluntario;
	private Catalogo catVoluntario;
	
	private TextFieldCatalogo txtCatReconocimiento;
	private Catalogo catReconocimiento;
	
	private BindingDateField txtFecha;
	
	private boolean verificarCumplimientoHorasRequeridas(Reconocimiento reconocimiento, Voluntario voluntario) {
		Date hoy = new Date();
		boolean cumpleHorasRequeridas = false;
		if (reconocimiento.getCantidadMaximaHora().intValue() != 0 || reconocimiento.getCantidadMinimaHora().intValue()!=0){
			Date fechaFinConteo = new Date(hoy.getYear(),reconocimiento.getFechaPeriodoOtorgar().getMonth(),reconocimiento.getFechaPeriodoOtorgar().getDate());
			Date fechaInicioConteo = new Date(hoy.getYear()-reconocimiento.getPeriodoContabilizacion(),reconocimiento.getFechaPeriodoOtorgar().getMonth(),reconocimiento.getFechaPeriodoOtorgar().getDate());
			int totalHoras = 0;
			for(AsistenciaVoluntario asistencia : voluntario.getAsistenciaVoluntarios())
				if(reconocimiento.getConteoHoraIngresoVoluntario().equals(RespuestaCerrada.SI)
						|| asistencia.getActividadEjecutada().getFechaFinActividadEjecutada().after(fechaInicioConteo) && asistencia.getActividadEjecutada().getFechaFinActividadEjecutada().before(fechaFinConteo))
					totalHoras += asistencia.getHorasCumplidasVoluntario();
			if(totalHoras >= reconocimiento.getCantidadMinimaHora().intValue() && totalHoras <= reconocimiento.getCantidadMaximaHora().intValue())
				cumpleHorasRequeridas = true;
		} else
			cumpleHorasRequeridas = true;
		return cumpleHorasRequeridas;
	}
	
	private boolean verificarCumplimientoTipoActividadRequerido(Reconocimiento reconocimiento, Voluntario voluntario) {
		for (TipoActividadRequerida tipoActividadRequerida : reconocimiento.getTipoActividadRequeridas()) {
			boolean encontrado = false;
			for(AsistenciaVoluntario asistencia : voluntario.getAsistenciaVoluntarios()) {
				ActividadPlanificada actividadPlanificada = asistencia.getActividadEjecutada().getActividadPlanificadas().iterator().next();
				if(tipoActividadRequerida.getTipoActividad().equals(
						actividadPlanificada.getActividad().getTipoActividad())) {
					encontrado = true;
					break;
				}
			}
			if (!encontrado)
				return false;
		}
		return true;
	}
	
	private boolean verificarCumplimientoTiempoRequerido(Reconocimiento reconocimiento, Voluntario voluntario) {
		Date hoy = new Date();
		boolean cumpleTiempoCrv = false;
		if(reconocimiento.getTiempoMinimoCrv().intValue() != 0 || reconocimiento.getTiempoMaximoCrv().intValue() != 0) {
			Integer tiempoCrv = new Integer(0);
			Date ingreso = voluntario.getFechaIngresoVoluntario();
			Date auxIngreso = new Date(hoy.getYear(),ingreso.getMonth(),ingreso.getDate());
			if(hoy.before(auxIngreso))
				tiempoCrv = new Integer(hoy.getYear() - ingreso.getYear() - 1);
			else
				tiempoCrv = new Integer(hoy.getYear() - ingreso.getYear());
			if(reconocimiento.getTiempoMinimoCrv().intValue()!=0 && reconocimiento.getTiempoMaximoCrv().intValue()==0){
				if(tiempoCrv.intValue()>=reconocimiento.getTiempoMinimoCrv())
					cumpleTiempoCrv = true;
			} else if(tiempoCrv.intValue()>=reconocimiento.getTiempoMinimoCrv() && tiempoCrv.intValue()<=reconocimiento.getTiempoMaximoCrv())
				cumpleTiempoCrv = true;
			
		} else
			cumpleTiempoCrv = true;
		return cumpleTiempoCrv;
	}
	
	private boolean verificarCumplimientoReconocimientos(Reconocimiento reconocimiento, Voluntario voluntario) {
		for (ReconocimientoRequerido reconocimientoRequerido :
			reconocimiento.getReconocimientoRequeridosForIdReconocimiento()) {
			boolean encontrado = false;
			for (ReconocimientoVoluntario reconocimientoVoluntario : voluntario.getReconocimientoVoluntarios())
				if (reconocimientoRequerido.getReconocimientoByIdReconocimientoRequisito().equals(reconocimientoVoluntario.getReconocimiento())) {
					encontrado = true;
					break;
				}
			if (!encontrado)
				return false;
		}
		return true;
	}
		
	private TextFieldCatalogoListener txtCatVoluntarioListener = new TextFieldCatalogoListener(){			
		public void onSeleccionar(Object objeto) {
			setVoluntario(((Voluntario)objeto));	
			txtCatVoluntario.setText(voluntario.getCodigoVoluntario());
		}			
	};
	
	private TextFieldCatalogoListener txtCatReconocimientoListener = new TextFieldCatalogoListener(){			
		public void onSeleccionar(Object objeto) {
			setReconocimiento(((Reconocimiento)objeto));	
			txtCatReconocimiento.setText(reconocimiento.getNombreReconocimiento());
		}			
	};
	
	public Voluntario getVoluntario() {
		return voluntario;
	}


	public void setVoluntario(Voluntario voluntario) {
		this.voluntario = voluntario;
	}


	public void initComponents () {
		this.reconocimientovoluntario = new ReconocimientoVoluntario();
		
		txtFecha=new BindingDateField(150);

		this.removeAll();
		this.setEnabled(true);

		Grid grid1 = new Grid();
		grid1.setStyleName("Obelisco.GridPaneDialogo");
		grid1.setSize(2); //Numero de columnas de la tabla
		grid1.setColumnWidth(0, new Extent(150, Extent.PX)); //PX denota pixeles
		
		Label lblReconocimiento = new Label ("Reconocimiento");		
		txtCatReconocimiento = new TextFieldCatalogo(150);
		txtCatReconocimiento.setCatalogo(this.catReconocimiento);
		txtCatReconocimiento.addCatalogoListener(this.txtCatReconocimientoListener);		
		grid1.add(lblReconocimiento);
		grid1.add(txtCatReconocimiento);
		
		Label lblVoluntario = new Label ("Voluntario");
		txtCatVoluntario = new TextFieldCatalogo(150);
		txtCatVoluntario.setCatalogo(this.catVoluntario);
		txtCatVoluntario.addCatalogoListener(this.txtCatVoluntarioListener);
		grid1.add(lblVoluntario);
		grid1.add(txtCatVoluntario);
		
		Label lblFecha = new Label ("Fecha de Entrega");
		grid1.add(lblFecha);
		grid1.add(txtFecha);
		
		Column columna = new Column();
		columna.add(grid1);
		
		this.add(columna);
	}
	
	
	public void onCancelar() {
	}

	public void onConfirmarCambios(Object arg0, TipoFuncion tipoFuncion, String arg2) {
		Calendar c = txtFecha.getDateChooser().getSelectedDate();					
		reconocimientovoluntario.setFechaEntrega(c.getTime());
		reconocimientovoluntario.setAnnoEntrega(c.get(Calendar.YEAR));
		reconocimientovoluntario.setVoluntario(voluntario);		
		reconocimientovoluntario.setReconocimiento(reconocimiento);
		reconocimientovoluntario.setEstado(DataGenerica.DATA_ACTIVO);
		servicioAdministracionAsignarReconocimiento.guardarReconocimientoVoluntario(reconocimientovoluntario);
	}

	public void onConfirmarEliminacion(Object arg0) {
	}

	public void onConsultar(Object arg0) {
		setEnabled(false);
		colocaEstado(arg0);
	}

	public void onCrear() {		
	}
	

	public void onFuncionPersonalizada(Object arg0, TipoFuncion arg1, String arg2) {
	}

	public void onIncluir(Object arg0) {
		
	}

	public void onInicializar() {
		this.initComponents();		
	}
	
	private void colocaEstado(Object arg0){
		ReconocimientoVoluntario reconocimientoVoluntario = (ReconocimientoVoluntario) arg0;
		
		this.reconocimiento = reconocimientoVoluntario.getReconocimiento();
		this.voluntario = reconocimientoVoluntario.getVoluntario();
		
		txtCatVoluntario.setText(reconocimientoVoluntario.getVoluntario().getIdVoluntario().toString());
		txtCatReconocimiento.setText(reconocimientoVoluntario.getReconocimiento().getNombreReconocimiento());
		Calendar c=Calendar.getInstance();
		c.setTime(reconocimientoVoluntario.getFechaEntrega());
		txtFecha.setSelectedDate(c);
	}

	public void onModificar(Object arg0) {
		colocaEstado(arg0);			
	}

	public void onObjetoEntidad(Object arg0) {
		this.reconocimientovoluntario = (ReconocimientoVoluntario) arg0;
	}

	public boolean onValidarDatos(Object arg0, TipoFuncion arg1, String arg2) {
		if (reconocimiento == null)
			throw new ObeliscoException("DEBE SELECCIONAR UN RECONOCIMIENTO.");
		
		if (voluntario == null)
			throw new ObeliscoException("DEBE SELECCIONAR UN VOLUNTARIO.");
		
		if (!verificarCumplimientoHorasRequeridas(reconocimiento, voluntario)
					|| !verificarCumplimientoTipoActividadRequerido(reconocimiento, voluntario)
					|| !verificarCumplimientoTiempoRequerido(reconocimiento, voluntario)
					|| !verificarCumplimientoReconocimientos(reconocimiento, voluntario))
			throw new ObeliscoException("EL VOLUNTARIO NO CUMPLE LOS REQUISITOS PARA EL RECONOCIMIENTO.");
		
		if (servicioAdministracionAsignarReconocimiento.existeReconocimientoVoluntario(reconocimiento, voluntario))
			throw new ObeliscoException("YA HA SIDO ASIGNADO EL RECONOCIMIENTO AL VOLUNTARIO.");
		
		return true;
	}

	public IServicioAdministracionAsignarReconocimiento getServicioAdministracionAsignarReconocimiento() {
		return servicioAdministracionAsignarReconocimiento;
	}

	public void setServicioAdministracionAsignarReconocimiento(
		IServicioAdministracionAsignarReconocimiento servicioAdministracionAsignarReconocimiento) {
		this.servicioAdministracionAsignarReconocimiento = servicioAdministracionAsignarReconocimiento;
	}


	public Catalogo getCatVoluntario() {
		return catVoluntario;
	}


	public void setCatVoluntario(Catalogo catVoluntario) {
		this.catVoluntario = catVoluntario;
	}


	public TextFieldCatalogo getTxtCatVoluntario() {
		return txtCatVoluntario;
	}


	public void setTxtCatVoluntario(TextFieldCatalogo txtCatVoluntario) {
		this.txtCatVoluntario = txtCatVoluntario;
	}


	public Catalogo getCatReconocimiento() {
		return catReconocimiento;
	}


	public void setCatReconocimiento(Catalogo catReconocimiento) {
		this.catReconocimiento = catReconocimiento;
	}


	public TextFieldCatalogo getTxtCatReconocimiento() {
		return txtCatReconocimiento;
	}


	public void setTxtCatReconocimiento(TextFieldCatalogo txtCatReconocimiento) {
		this.txtCatReconocimiento = txtCatReconocimiento;
	}


	public Reconocimiento getReconocimiento() {
		return reconocimiento;
	}


	public void setReconocimiento(Reconocimiento reconocimiento) {
		this.reconocimiento = reconocimiento;
	}


	public void onListaParametros(List listaParametros) {
	}
	
}

